package com.tgpms.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import com.alibaba.fastjson.JSONObject;

public class VformBeanUtil {

	/**
	* @Author newway
	* @Description Vform转实体为jsonString
	* @Date 2019年8月13日下午5:53:21
	* @Param 
	* @return 
	**/
	public static JSONObject entityToJsonString(Object entity) {
		JSONObject json = new JSONObject();
        try {
			// 获取实体类的所有属性（包含父类），返回Field数组
            Class clazz = entity.getClass();
            List<Field> fieldList = new ArrayList<>();
            while (clazz != null){
                fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
                clazz = clazz.getSuperclass();
            }
            Field[] field = new Field[fieldList.size()];
            fieldList.toArray(field);
//			Field[] field = new Field[fieldList.size()];
			// 获取属性的名字
			for (int i = 0; i < field.length; i++) {
			    //可访问私有变量
			    field[i].setAccessible(true);
			    // 获取属性的名字
			    String name = field[i].getName();
			    //排除不需要转换的字段
			    if(name.equals("insertUser") || name.equals("insertDate") || name.equals("modifyUser")
			    		|| name.equals("modifyDate") || name.equals("dataOwner")) {
			    	continue;
			    }
			    // 将属性的首字母大写
			    String bigname = name.replaceFirst(name.substring(0, 1), name.substring(0, 1)
			            .toUpperCase());
			    //对象字段转下划线大写
			    String hname = HumpUtils.humpToLine2(name);
			    //获取属性的类型
			    String type = field[i].getGenericType().toString();
			    
			    // 如果type是类类型，则前面包含"class "，后面跟类名
			    Method m = entity.getClass().getMethod("get" + bigname);
			    // 调用getter方法获取属性值
			    if(m.invoke(entity)==null || m.invoke(entity).equals("")) {
			    	json.put(hname.toUpperCase(), "");
			    }else {
			    	//如果属性类型是Date类型需要转换
			    	if(type.equals("class java.util.Date")) {
			    		json.put(hname.toUpperCase(), DateToString(m.invoke(entity)));
			    	}else {
			    		json.put(hname.toUpperCase(), m.invoke(entity));
			    	}
			    }
			}
		} catch (Exception e) {
			e.printStackTrace();
			json.clear();
		} 
        return json;
    }
	
	/**
	* @Author newway
	* @Description Vform转实体为jsonString 更新时使用
	* @Date 2019年8月13日下午5:53:21
	* @Param 
	* @return 
	**/
	public static JSONObject entityToJsonStringByUpdate(Object entity) {
		JSONObject json = new JSONObject();
        try {
			// 获取实体类的所有属性，返回Field数组
			Field[] field = entity.getClass().getDeclaredFields();
			// 获取属性的名字
			for (int i = 0; i < field.length; i++) {
			    //可访问私有变量
			    field[i].setAccessible(true);
			    // 获取属性的名字
			    String name = field[i].getName();
			    //排除不需要转换的字段
			    if(name.equals("insertUser") || name.equals("insertDate") || name.equals("modifyUser")
			    		|| name.equals("modifyDate") || name.equals("dataOwner")) {
			    	continue;
			    }
			    // 将属性的首字母大写
			    String bigname = name.replaceFirst(name.substring(0, 1), name.substring(0, 1)
			            .toUpperCase());
			    //对象字段转下划线大写
			    String hname = HumpUtils.humpToLine2(name);
			    //获取属性的类型
			    String type = field[i].getGenericType().toString();
			    
			    // 如果type是类类型，则前面包含"class "，后面跟类名
			    Method m = entity.getClass().getMethod("get" + bigname);
			    // 调用getter方法获取属性值
			    if(m.invoke(entity)==null || m.invoke(entity).equals("")) {
					json.put(hname.toUpperCase(), m.invoke(entity));
			    }else {
			    	//如果属性类型是Date类型需要转换
			    	if(type.equals("class java.util.Date")) {
			    		json.put(hname.toUpperCase(), DateToString(m.invoke(entity)));
			    	}else {
			    		json.put(hname.toUpperCase(), m.invoke(entity));
			    	}
			    }
			}
		} catch (Exception e) {
			e.printStackTrace();
			json.clear();
		} 
        return json;
    }
	
	/**
	* @Author newway
	* @Description 时间格式转2019/08/14
	* @Date 2019年8月14日下午5:42:35
	* @Param 
	* @return 
	**/
	private static String DateToString(Object date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
	}
}
